package com.dys.testrelect02;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * @className: com.dys.testrelect02.Test3
 * @description: 获取属性和对属性进行赋值
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/08/27 下午10:05
 */
public class Test3 {
    /**
     * 这是一个main()方法,是应用程序的入口
     *
     * @param args 方法的形参列表,是一个字符串数组,包含了从命令行传递给程序的参数
     */
    public static void main(String[] args) throws NoSuchFieldException, InstantiationException, IllegalAccessException {
        // 获取字节码信息
        Class<Student> cls = Student.class;

        // 通过字节码信息获取属性值
        // getFields() 只能获取被public修饰的属性
        Field[] fields = cls.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        // 获取运行时类中的所有属性
        System.out.println("========================");
        Field[] declaredFields = cls.getDeclaredFields();
        for (Field field : declaredFields) {
            System.out.println(field);
        }

        // 获取指定的属性
        System.out.println("-------------------");
        Field score = cls.getField("score");
        System.out.println(score);
        Field sno = cls.getDeclaredField("sno");
        System.out.println(sno);

        // 获取属性的具体结构
        System.out.println("*********************");
        // 属性的访问修饰符
        int modifiers = cls.getModifiers();
        System.out.println(Modifier.toString(modifiers));
        // 属性的数据类型
        Field score2 = cls.getField("score");
        Class<?> clazz = score2.getType();
        System.out.println(clazz.getName());

        // 属性的名字
        Field score3 = cls.getField("score");
        System.out.println(score3.getName());

        // 给属性设置值
        System.out.println("==========================");
        // 给属性赋值：(给属性设置值，必须要有对象)
        Student stu = cls.newInstance();
        Field score1 = cls.getField("score");
        // 给obj这个对象的score属性设置具体的值，这个值为98
        score1.set(stu, 98);
        System.out.println(stu);
    }
}
